package com.szholly.plug.safe.entity.user;

import java.util.HashMap;

import org.springframework.stereotype.Component;

import com.szholly.utils.spring.SpringBeanFactory;
import com.szholly.data.general.*;
import com.szholly.data.general.metadata.IBaseTable;
import com.szholly.plug.form.validation.ValidationRegex;

/**
 * 定义用户表
 */
@Component("SAFE_USER")
public class UserService extends InterceptorTableBase implements IBaseTable {
	
	public final static String TABLE_NAME = "SAFE_USER";

	/**
	 * 获取单例对象
	 */
	public static UserService getSingleRef() {
		return (UserService) SpringBeanFactory
				.getBean("SAFE_USER");
	}
	
	@Override
	public String getMetadataTableName() {
		return TABLE_NAME;
	}

	@Override
	public String getMetadataTableAliasName() {
		return "用户表";
	}

	private HashMap<String, Field> fields;

	@Override
	protected HashMap<String, Field> fields() {
		if (fields == null) {
			fields = new HashMap<String, Field>();

			Field itemField = new Field();
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_USERID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(2);
			itemField.setFieldAliasName("用户ID");
			itemField.setIsKey(true);
			itemField.setCanShow(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_C_USERNAME);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(3);
			itemField.setFieldAliasName("账号");
			itemField.setCanShow(true);
			itemField.setAllowNull(false);
			itemField.setUniqueGroup("C_USERNAME");
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_C_PWD);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(4);
			itemField.setFieldAliasName("用户密码");
			itemField.setCanShow(true);
			itemField.setAllowNull(false);
			itemField.setRegEx("^[0-9a-zA-Z]+$");
			itemField.setMaxLen(16);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_C_USEREALNAME);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(5);
			itemField.setFieldAliasName("姓名");
			itemField.setCanShow(true);
			itemField.setAllowNull(false);
			itemField.setMaxLen(30);
			itemField.setRegEx(ValidationRegex.CHINESE);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_C_USERTEL);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(6);
			itemField.setFieldAliasName("用户电话");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			//itemField.setRegEx(ValidationRegex.MOBILE_PHONE);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_C_USEREMIL);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("用户邮件");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			itemField.setRegEx(ValidationRegex.EMAIL);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);

			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_ORGID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(8);
			itemField.setFieldAliasName("组织机构ID");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_ORGNAME);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("组织机构名称");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_DW);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("单位名称");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_DEPTID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("部门ID");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_DEPTNAME);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("部门名称");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_ZQID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(7);
			itemField.setFieldAliasName("政区ID");
			itemField.setCanShow(true);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Certificate);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(9);
			itemField.setFieldAliasName("证书");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Sex);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(11);
			itemField.setFieldAliasName("性别");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_GraduateSchool);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(13);
			itemField.setFieldAliasName("毕业学校");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_EnterTime);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(15);
			itemField.setFieldAliasName("入职日期");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Nation);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(17);
			itemField.setFieldAliasName("民族");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_BirthDate);
			itemField.setDataType(GlobalDataType.DateTime);
			itemField.setFieldID(20);
			itemField.setFieldAliasName("出生日期");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Degree);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(23);
			itemField.setFieldAliasName("学历");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Photo);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(24);
			itemField.setFieldAliasName("照片");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_Card);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(25);
			itemField.setFieldAliasName("资格证");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.SIGN_IMG);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(24);
			itemField.setFieldAliasName("签名照");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_WECHATENTER_ID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(26);
			itemField.setFieldAliasName("微信企业号");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
			
			itemField = new Field();
			itemField.setFieldName(UserEntity.FIELD_WECHAT_ID);
			itemField.setDataType(GlobalDataType.String);
			itemField.setFieldID(27);
			itemField.setFieldAliasName("个人微信号");
			itemField.setCanShow(false);
			itemField.setAllowNull(true);
			fields.put(itemField.getFieldName().toUpperCase().trim(), itemField);
		}
		return fields;
	}
	
	private RelationNode relationNode;
	/**
	 * 表关系
	 */
	@Override
	public RelationNode getRelation() {
		if (relationNode == null) {
			relationNode = new RelationNode(TABLE_NAME);

			// 用户与用户角色
			RelationInfo relationInfo = new RelationInfo();
			relationInfo.Foreignkey = new HashMap<String, String>();
			relationInfo.Foreignkey.put(UserEntity.FIELD_USERID, UserRoleEntity.FIELD_USERID);
			relationInfo.RelationStrength = RelationStrength.UpdateChild;
			relationInfo.RelationType = RelationType.OneToMore;
			relationInfo.metadataTableAliasName = "用户与用户角色";
			relationNode.getChildRelationNode().put(UserRoleService.TABLE_NAME, relationInfo);
		}
		return relationNode;
	}
	
	/**
	 * 表分组信息
	 */
	@Override
	public String getTableGroup() {
		return "用户权限控制";
	}

	@Override
	public String getCodeFieldName() {
		return UserEntity.FIELD_USERID;
	}

	@Override
	public String getCaptionFieldName() {
		return UserEntity.FIELD_C_USEREALNAME;
	}

	@Override
	public boolean getIsCodeTable() {
		return true;
	}
	
	@Override
	public boolean getIsManageCodeTable(){
		return false;
	}
	
	@Override
	public String getGUIDFieldName(){
		return UserEntity.FIELD_USERID;
	}
}